ee817bda2e50111d4c3075a3be141585d54f0b0f,languages/baseLanguage/closures/source_gen/jetbrains/mps/baseLanguage/closures/typesystem/typeof_ClosureLiteral_InferenceRule.java,typeof_ClosureLiteral_InferenceRule,applyRule,#SNode#TypeCheckingContext#IsApplicableStatus#,41
Before Change
{
SNode _nodeToCheck_1029348928467 = closure;
EquationInfo _info_12389875345 = new EquationInfo(_nodeToCheck_1029348928467, null, "r:00000000-0000-4000-0000-011c89590337(jetbrains.mps.baseLanguage.closures.typesystem)", "1221663085197", 0, null);
typeCheckingContext.createEquation((SNode) typeCheckingContext.getRepresentative(RESULT_typevar_1221579592331), (SNode) typeCheckingContext.getRepresentative(RET_AND_TERM_typevar_1232125197501), _info_12389875345);
}
} else {
{
After Change
public typeof_ClosureLiteral_InferenceRule() {
}
public void applyRule(final SNode closure, final TypeCheckingContext typeCheckingContext, IsApplicableStatus status) {
List<SNode> paramTypes = ListSequence.fromList(new ArrayList<SNode>());
for (SNode param : SLinkOperations.getTargets(closure, "parameter", true)) {
if (SNodeOperations.isInstanceOf(SLinkOperations.getTarget(param, "type", true), "jetbrains.mps.baseLanguage.structure.WildCardType") || SNodeOperations.isInstanceOf(SLinkOperations.getTarget(param, "type", true), "jetbrains.mps.baseLanguage.structure.UndefinedType")) {
final SNode pt_typevar_1221579075465 = typeCheckingContext.createNewRuntimeTypesVariable();
{
SNode _nodeToCheck_1029348928467 = param;
EquationInfo _info_12389875345 = new EquationInfo(_nodeToCheck_1029348928467, null, "r:00000000-0000-4000-0000-011c89590337(jetbrains.mps.baseLanguage.closures.typesystem)", "1221579075466", 0, null);
typeCheckingContext.createEquation((SNode) typeCheckingContext.getRepresentative(pt_typevar_1221579075465), (SNode) typeCheckingContext.typeOf(_nodeToCheck_1029348928467, "r:00000000-0000-4000-0000-011c89590337(jetbrains.mps.baseLanguage.closures.typesystem)", "1221579075470", true), _info_12389875345);
}
ListSequence.fromList(paramTypes).addElement(typeCheckingContext.getRepresentative(pt_typevar_1221579075465));
} else if ((SLinkOperations.getTarget(param, "type", true) != null)) {
ListSequence.fromList(paramTypes).addElement(SLinkOperations.getTarget(param, "type", true));
}
}
List<SNode> allRets = ListSequence.fromList(new ArrayList<SNode>());
List<SNode> allYlds = ListSequence.fromList(new ArrayList<SNode>());
List<SNode> allYldAlls = ListSequence.fromList(new ArrayList<SNode>());
List<SNode> allStmts = ListSequence.fromList(new LinkedList<SNode>());
List<SNode> allThrows = ListSequence.fromList(new ArrayList<SNode>());
List<SNode> allCatches = ListSequence.fromList(new ArrayList<SNode>());
for (SNode c : SNodeOperations.getChildren(SLinkOperations.getTarget(closure, "body", true))) {
if (SNodeOperations.isInstanceOf(c, "jetbrains.mps.baseLanguage.structure.ReturnStatement")) {
ListSequence.fromList(allRets).addElement(c);
} else if (SNodeOperations.isInstanceOf(c, "jetbrains.mps.baseLanguage.closures.structure.YieldStatement")) {
ListSequence.fromList(allYlds).addElement(c);
} else if (SNodeOperations.isInstanceOf(c, "jetbrains.mps.baseLanguage.closures.structure.YieldAllStatement")) {
ListSequence.fromList(allYldAlls).addElement(c);
} else if (!(SNodeOperations.isInstanceOf(c, "jetbrains.mps.baseLanguage.structure.CommentedStatementsBlock")) && !(SNodeOperations.isInstanceOf(c, "jetbrains.mps.baseLanguage.structure.IStatementListContainer"))) {
ListSequence.fromList(allStmts).addElement(c);
}
}
while (!(ListSequence.fromList(allStmts).isEmpty())) {
SNode stmt = ListSequence.fromList(allStmts).removeElementAt(0);
if (SNodeOperations.isInstanceOf(stmt, "jetbrains.mps.baseLanguage.structure.ReturnStatement")) {
ListSequence.fromList(allRets).addElement(stmt);
} else if (SNodeOperations.isInstanceOf(stmt, "jetbrains.mps.baseLanguage.closures.structure.YieldStatement")) {
ListSequence.fromList(allYlds).addElement(stmt);
} else if (SNodeOperations.isInstanceOf(stmt, "jetbrains.mps.baseLanguage.closures.structure.YieldAllStatement")) {
ListSequence.fromList(allYldAlls).addElement(stmt);
} else
if (SNodeOperations.isInstanceOf(stmt, "jetbrains.mps.baseLanguage.closures.structure.YieldStatement")) {
ListSequence.fromList(allYlds).addElement(stmt);
} else {
if (SNodeOperations.isInstanceOf(stmt, "jetbrains.mps.baseLanguage.structure.ThrowStatement")) {
final SNode tt_typevar_1221579075612 = typeCheckingContext.createNewRuntimeTypesVariable();
{
SNode _nodeToCheck_1029348928467 = SLinkOperations.getTarget(SNodeOperations.cast(stmt, "jetbrains.mps.baseLanguage.structure.ThrowStatement"), "throwable", true);
EquationInfo _info_12389875345 = new EquationInfo(_nodeToCheck_1029348928467, null, "r:00000000-0000-4000-0000-011c89590337(jetbrains.mps.baseLanguage.closures.typesystem)", "1221579075613", 0, null);
typeCheckingContext.createEquation((SNode) typeCheckingContext.getRepresentative(tt_typevar_1221579075612), (SNode) typeCheckingContext.typeOf(_nodeToCheck_1029348928467, "r:00000000-0000-4000-0000-011c89590337(jetbrains.mps.baseLanguage.closures.typesystem)", "1221579075617", true), _info_12389875345);
}
ListSequence.fromList(allThrows).addElement(typeCheckingContext.getRepresentative(tt_typevar_1221579075612));
} else if (SNodeOperations.isInstanceOf(stmt, "jetbrains.mps.baseLanguage.structure.TryStatement")) {
for (SNode caught : ListSequence.fromList(SLinkOperations.getTargets(SNodeOperations.cast(stmt, "jetbrains.mps.baseLanguage.structure.TryStatement"), "catchClause", true)).where(new IWhereFilter<SNode>() {
public boolean accept(SNode it) {
return SNodeOperations.isInstanceOf(SLinkOperations.getTarget(SLinkOperations.getTarget(it, "throwable", true), "type", true), "jetbrains.mps.baseLanguage.structure.ClassifierType");
}
}).select(new ISelector<SNode, SNode>() {
public SNode select(SNode it) {
return SNodeOperations.as(SLinkOperations.getTarget(SLinkOperations.getTarget(it, "throwable", true), "type", true), "jetbrains.mps.baseLanguage.structure.ClassifierType");
}
})) {
ListSequence.fromList(allCatches).addElement(caught);
}
} else if (SNodeOperations.isInstanceOf(stmt, "jetbrains.mps.baseLanguage.structure.TryCatchStatement")) {
for (SNode caught : ListSequence.fromList(SLinkOperations.getTargets(SNodeOperations.cast(stmt, "jetbrains.mps.baseLanguage.structure.TryCatchStatement"), "catchClause", true)).where(new IWhereFilter<SNode>() {
public boolean accept(SNode it) {
return SNodeOperations.isInstanceOf(SLinkOperations.getTarget(SLinkOperations.getTarget(it, "throwable", true), "type", true), "jetbrains.mps.baseLanguage.structure.ClassifierType");
}
}).select(new ISelector<SNode, SNode>() {
public SNode select(SNode it) {
return SNodeOperations.as(SLinkOperations.getTarget(SLinkOperations.getTarget(it, "throwable", true), "type", true), "jetbrains.mps.baseLanguage.structure.ClassifierType");
}
})) {
ListSequence.fromList(allCatches).addElement(caught);
}
} else {
for (SNode thr : ListSequence.fromList(SNodeOperations.getDescendants(stmt, "jetbrains.mps.baseLanguage.structure.IMethodCall", false, new String[]{"jetbrains.mps.baseLanguage.structure.IStatementListContainer"})).translate(new ITranslator2<SNode, SNode>() {
public Iterable<SNode> translate(SNode it) {
return IMethodLike_Behavior.call_getThrowableTypes_6204026822016975623(SLinkOperations.getTarget(it, "baseMethodDeclaration", false));
}
})) {
ListSequence.fromList(allThrows).addElement(SNodeOperations.copyNode(thr));
}
}
List<SNode> allChildren = ListSequence.fromList(new LinkedList<SNode>());
ListSequence.fromList(allChildren).addSequence(ListSequence.fromList(SNodeOperations.getChildren(stmt)));
while (ListSequence.fromList(allChildren).isNotEmpty()) {
SNode c = ListSequence.fromList(allChildren).removeElementAt(0);
if (SNodeOperations.isInstanceOf(c, "jetbrains.mps.baseLanguage.structure.StatementList")) {
for (SNode cstmt : SLinkOperations.getTargets(SNodeOperations.cast(c, "jetbrains.mps.baseLanguage.structure.StatementList"), "statement", true)) {
if (!(SNodeOperations.isInstanceOf(cstmt, "jetbrains.mps.baseLanguage.structure.CommentedStatementsBlock")) && !(SNodeOperations.isInstanceOf(cstmt, "jetbrains.mps.baseLanguage.structure.IStatementListContainer"))) {
ListSequence.fromList(allStmts).addElement(cstmt);
}
}
} else if (!(SNodeOperations.isInstanceOf(c, "jetbrains.mps.baseLanguage.structure.IStatementListContainer"))) {
ListSequence.fromList(allChildren).addSequence(ListSequence.fromList(SNodeOperations.getChildren(c)));
}
}
}
}
List<SNode> realThrows = ListSequence.fromList(new ArrayList<SNode>());
with_allThrows:
for (SNode another : allThrows) {
if (SNodeOperations.isInstanceOf(another, "jetbrains.mps.baseLanguage.structure.ClassifierType")) {
for (SNode one : realThrows) {
if (SNodeOperations.isInstanceOf(one, "jetbrains.mps.baseLanguage.structure.ClassifierType") && (SLinkOperations.getTarget(SNodeOperations.cast(one, "jetbrains.mps.baseLanguage.structure.ClassifierType"), "classifier", false) == SLinkOperations.getTarget(SNodeOperations.cast(another, "jetbrains.mps.baseLanguage.structure.ClassifierType"), "classifier", false)) || Classifier_Behavior.call_isDescendant_7165541881557222913(SLinkOperations.getTarget(SNodeOperations.cast(another, "jetbrains.mps.baseLanguage.structure.ClassifierType"), "classifier", false), SLinkOperations.getTarget(SNodeOperations.cast(one, "jetbrains.mps.baseLanguage.structure.ClassifierType"), "classifier", false))) {
continue with_allThrows;
}
if (MatchingUtil.matchNodes(one, another)) {
continue with_allThrows;
}
}
for (SNode caught : allCatches) {
if (SNodeOperations.isInstanceOf(caught, "jetbrains.mps.baseLanguage.structure.ClassifierType") && (SLinkOperations.getTarget(SNodeOperations.cast(caught, "jetbrains.mps.baseLanguage.structure.ClassifierType"), "classifier", false) == SLinkOperations.getTarget(SNodeOperations.cast(another, "jetbrains.mps.baseLanguage.structure.ClassifierType"), "classifier", false) || Classifier_Behavior.call_isDescendant_7165541881557222913(SLinkOperations.getTarget(SNodeOperations.cast(another, "jetbrains.mps.baseLanguage.structure.ClassifierType"), "classifier", false), SLinkOperations.getTarget(SNodeOperations.cast(caught, "jetbrains.mps.baseLanguage.structure.ClassifierType"), "classifier", false)))) {
continue with_allThrows;
}
if (MatchingUtil.matchNodes(caught, another)) {
continue with_allThrows;
}
}
}
ListSequence.fromList(realThrows).addElement(another);
}
final SNode RLCS_typevar_1221579075692 = typeCheckingContext.createNewRuntimeTypesVariable();
boolean isVoid = false;
for (SNode rs : allRets) {
if (SNodeOperations.isInstanceOf(SLinkOperations.getTarget(SNodeOperations.cast(rs, "jetbrains.mps.baseLanguage.structure.ReturnStatement"), "expression", true), "jetbrains.mps.baseLanguage.structure.NullLiteral")) {
{
SNode _nodeToCheck_1029348928467 = closure;
EquationInfo _info_12389875345 = new EquationInfo(_nodeToCheck_1029348928467, null, "r:00000000-0000-4000-0000-011c89590337(jetbrains.mps.baseLanguage.closures.typesystem)", "3294521177951941138", 0, null);
typeCheckingContext.createGreaterThanInequality((SNode) typeCheckingContext.getRepresentative(RLCS_typevar_1221579075692), (SNode) new typeof_ClosureLiteral_InferenceRule.QuotationClass_nx7618_a0a0a0a41a0().createNode(typeCheckingContext), false, true, _info_12389875345);
}
} else {
SNode retExpression = SLinkOperations.getTarget(SNodeOperations.cast(rs, "jetbrains.mps.baseLanguage.structure.ReturnStatement"), "expression", true);
if (retExpression == null) {
{
SNode _nodeToCheck_1029348928467 = closure;
EquationInfo _info_12389875345 = new EquationInfo(_nodeToCheck_1029348928467, null, "r:00000000-0000-4000-0000-011c89590337(jetbrains.mps.baseLanguage.closures.typesystem)", "7668447476859502248", 0, null);
typeCheckingContext.createGreaterThanInequality((SNode) typeCheckingContext.getRepresentative(RLCS_typevar_1221579075692), (SNode) new typeof_ClosureLiteral_InferenceRule.QuotationClass_nx7618_a0a0a1a0a0o0a().createNode(typeCheckingContext), false, true, _info_12389875345);
}
isVoid = true;
} else {
{
SNode _nodeToCheck_1029348928467 = retExpression;
EquationInfo _info_12389875345 = new EquationInfo(_nodeToCheck_1029348928467, null, "r:00000000-0000-4000-0000-011c89590337(jetbrains.mps.baseLanguage.closures.typesystem)", "5604339164783014263", 0, null);
typeCheckingContext.createGreaterThanInequality((SNode) typeCheckingContext.getRepresentative(RLCS_typevar_1221579075692), (SNode) typeCheckingContext.typeOf(_nodeToCheck_1029348928467, "r:00000000-0000-4000-0000-011c89590337(jetbrains.mps.baseLanguage.closures.typesystem)", "5604339164783014269", true), false, true, _info_12389875345);
}
}
}
}
final SNode YLCS_typevar_1221579075693 = typeCheckingContext.createNewRuntimeTypesVariable();
for (SNode ys : allYlds) {
if (SNodeOperations.isInstanceOf(SLinkOperations.getTarget(SNodeOperations.cast(ys, "jetbrains.mps.baseLanguage.closures.structure.YieldStatement"), "expression", true), "jetbrains.mps.baseLanguage.structure.NullLiteral")) {
{
SNode _nodeToCheck_1029348928467 = closure;
EquationInfo _info_12389875345 = new EquationInfo(_nodeToCheck_1029348928467, null, "r:00000000-0000-4000-0000-011c89590337(jetbrains.mps.baseLanguage.closures.typesystem)", "7668447476859502122", 0, null);
typeCheckingContext.createGreaterThanInequality((SNode) typeCheckingContext.getRepresentative(YLCS_typevar_1221579075693), (SNode) new typeof_ClosureLiteral_InferenceRule.QuotationClass_nx7618_a0a0a0a61a0().createNode(typeCheckingContext), false, true, _info_12389875345);
}
} else {
{
SNode _nodeToCheck_1029348928467 = SLinkOperations.getTarget(SNodeOperations.cast(ys, "jetbrains.mps.baseLanguage.closures.structure.YieldStatement"), "expression", true);
EquationInfo _info_12389875345 = new EquationInfo(_nodeToCheck_1029348928467, null, "r:00000000-0000-4000-0000-011c89590337(jetbrains.mps.baseLanguage.closures.typesystem)", "7668447476859502152", 0, null);
typeCheckingContext.createGreaterThanInequality((SNode) typeCheckingContext.getRepresentative(YLCS_typevar_1221579075693), (SNode) typeCheckingContext.typeOf(_nodeToCheck_1029348928467, "r:00000000-0000-4000-0000-011c89590337(jetbrains.mps.baseLanguage.closures.typesystem)", "7668447476859502170", true), false, true, _info_12389875345);
}
}
}